# -*- coding: utf-8 -*-
# !/usr/bin/python3
# SQM的misc工具
# 2024年7月12日 V1.1.0
import os ,re 

from PySide6.QtCore import Signal , Qt
from PySide6.QtGui import  QDragEnterEvent , QDropEvent ,QCursor ,QAction ,QFont
from PySide6.QtWidgets import QApplication , QWidget ,QMenu 

from zhuye_ui import Ui_zhu_windows
from tools import others , config , file , image , pcap , misc , zips 
from tools.jiaoben import *

class MainWindow(QWidget):
    输出信号 = Signal(str)
    设置进度 = Signal(int)
    进度信号 = Signal(int)
    
    def __init__(self):
        super().__init__()  # 初始化父类
        self.ui = Ui_zhu_windows() # 实例化UI类
        self.ui.setupUi(self)      # 设置UI
        self.but()                 # 设置按钮功能
        self.setAcceptDrops(True)  # 设置 input_echo 窗口可以接受拖拽放入文件

        self.设置进度.connect(lambda i: self.ui.progressBar.setMaximum(i))
        self.进度信号.connect(lambda i: self.ui.progressBar.setValue(i))
        self.输出信号.connect(self.高亮)
        self.ui.dir_list.currentChanged['int'].connect(self.显示帮助)  # 设置点击主tab标签后的显示内容
        # self.ui.pcap_tab.currentChanged['int'].connect(self.显示流量标签) # 设置点击流量tab标签后的显示内容
        
        # 右键菜单设置
        self.ui.print_echo.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
        menu = QMenu(self)
        action1 = QAction("base64解码", self, triggered=lambda: misc.右键base64解码(self))
        action2 = QAction("URL解码", self, triggered=lambda: misc.右键url解码(self))
        action3 = QAction("hex解码", self, triggered=lambda: misc.hex解码(self))
        menu.addAction(action1)
        menu.addAction(action2)
        menu.addAction(action3)
        self.ui.print_echo.addActions([action1, action2, action3])

        self.ui.shell_type.activated.connect(self.获取shell类型)
      
    def 高亮(self,i):
        高亮字符集 = """flag{|bugku{|CATCTF{|ctf|=|}|cyberpeace|root"""
        if re.findall(高亮字符集, i ,re.I):
            高亮字符 = re.findall(高亮字符集,i ,re.I)
            colored_text = i.replace(f'{高亮字符[0]}', f'<span style="color:red;">{高亮字符[0]}</span>')
            self.ui.print_echo.append(colored_text)
            self.ui.print_echo.setdefault()
        else:
            self.ui.print_echo.append(i)

    # 拖拽文件到窗口，并加载文件路径到输入框
    def dragEnterEvent(self, a0:QDragEnterEvent) -> None:  # 鼠标托放事件，并执行一些操作
        if a0.mimeData().hasUrls() : # 判断有没有接受到文件路径,有的话保存文件路径，没有的话忽略
            a0.accept()             # 接受文件内容 ，a0 里面保存有文件的路径
        else:
            a0.ignore()    # 忽略文件内容
    
    def dropEvent(self, a0: QDropEvent) -> None:   # 鼠标释放事件，并执行一些操作
        # config.清理输出(self)
        if a0.mimeData().hasUrls():
            self.ui.input_echo.clear()
            for 路径 in a0.mimeData().urls():
                config.file_name = 路径.toLocalFile()
                config.文件目录 = os.path.split(路径.toLocalFile())[0]+'/'
                self.ui.print_echo.append(f'已设置文件为：{config.file_name}')
                self.ui.print_echo.append(f'已设置文件路劲为：{config.文件目录}')
                config.识别文件(self)
    """# 测试多线程  没搞定，已经寄了
    def 线程启动(self):  # !TODO 废了
        按钮 = self.sender().text()
        if 按钮 == "png高宽爆破":
            self.线程 = Thread(target = lambda : image.png高宽爆破(self))
        self.ui.print_echo.append('子线程启动')
        self.线程.start()
    """
    def but(self):   # 按钮设置
        # 设置区
        self.ui.shibie_but.clicked.connect(lambda: config.识别文件(self))       # 识别文件头，并加载二进制文件数据
        self.ui.dir_list.tabBarClicked.connect(self.显示帮助)                   # 设置点击标签后的显示内容
        self.ui.clear_but.clicked.connect(lambda: self.ui.print_echo.clear())   # 清理回显内的内容，这里可以直接执行
        self.ui.silu_but.clicked.connect(lambda: config.帮助(self))             # 设置帮助文档
        self.ui.set_str1_but.clicked.connect(lambda: config.设置变量1(self))
        self.ui.set_str2_but.clicked.connect(lambda: config.设置变量2(self))
        
        # 文件分析和编码
        self.ui.shibie_but.clicked.connect(lambda: config.二进制打开(self))        # 识别文件头，并加载二进制文件数据
        self.ui.fenli_but.clicked.connect(lambda: file.binwalk分离(self))   
        self.ui.for_but.clicked.connect(lambda: file.format文件分离(self))      
        self.ui.flag_search_but.clicked.connect(lambda: file.字符串搜索(self))   
        self.ui.cipin_fenxi_but.clicked.connect(lambda: file.字频分析(self)) 
        self.ui.print_str_but.clicked.connect(lambda: file.可打印字符(self))
        self.ui.zero_str_but.clicked.connect(lambda: file.零宽字符隐写(self))
        self.ui.str_down_but.clicked.connect(lambda: file.字符串翻转(self))  
                   
        # 各种编码
        self.ui.hex_str_but.clicked.connect(lambda: misc.hex解码(self))             
        self.ui.base_but.clicked.connect(lambda: misc.base解码(self))               
        self.ui.zhalan_but.clicked.connect(lambda: misc.栅栏密码(self))       
        self.ui.kaisa_but.clicked.connect(lambda: misc.爆破凯撒密码(self)) 
        self.ui.fuck_but.clicked.connect(lambda: misc.fuck解码(self,'')) 
        self.ui.ook_but.clicked.connect(lambda: misc.ook解码(self)) 
        self.ui.hexin_but.clicked.connect(lambda: misc.核心价值观解码(self))
        self.ui.hex_str.clicked.connect(lambda: misc.hex_str_带偏移(self)) 
        self.ui.html_but.clicked.connect(lambda: misc.html解码(self)) 
        self.ui.url_but.clicked.connect(lambda: misc.url解码(self,'')) 

        # 图像处理
        self.ui.png_high_but.clicked.connect(lambda: image.png高宽爆破(self))   
        self.ui.exif_but.clicked.connect(lambda: image.图片元数据(self))
        self.ui.mangshuiyin_but.clicked.connect(lambda: image.盲水印(self))
        self.ui.rgb2img_but.clicked.connect(lambda: image.RGB转图片(self))
        self.ui.bin_image_but.clicked.connect(lambda: image.bin_image(self))    # 二进制字符串转图片
        self.ui.jpg_high_but.clicked.connect(lambda: image.jpg高宽爆破(self))
        self.ui.gif_fenli_but.clicked.connect(lambda: image.GIF帧分离(self))
        self.ui.gif_hebing.clicked.connect(lambda: image.GIF合并(self))
        self.ui.tu_re.clicked.connect(lambda: image.图片逆序(self))
        self.ui.heibai_but.clicked.connect(lambda: image.黑白图(self))
        # self.ui.f5_steg_but.clicked.connect(image.F5隐写)
        # self.ui.Stegpy_but.clicked.connect(image.Stegpy)
        self.ui.Steghide_but.clicked.connect(lambda: image.StegHide(self))
        # self.ui.jpg_block_but.clicked.connect(image.jpg块隐藏)      
        # self.ui.png_idat_btu.clicked.connect(image.PNG图片检测IDAT)   
        # TODO Foremost

        # 压缩包
        self.ui.single_crc_but.clicked.connect(lambda: zips.单压缩包内CRC爆破(self)) 
        self.ui.more_crc_but.clicked.connect(lambda: zips.多文件压缩包CRC爆破(self))  
        self.ui.zip_wei_but.clicked.connect(lambda : zips.伪加密(self))

        # 流量分析
        self.ui.str_search_but.clicked.connect(lambda : pcap.字符串搜索(self))
        self.ui.tiqu_but.clicked.connect(lambda : pcap.提取日志(self))
        self.ui.ttl_but.clicked.connect(lambda : pcap.TTL分析(self))
        self.ui.len_but.clicked.connect(lambda : pcap.len长度分析(self))
        self.ui.sql_but.clicked.connect(lambda : pcap.注入分析.注入分析(self))
        self.ui.usb_but.clicked.connect(lambda : pcap.USB流量分析.USB流量分析(self))
        self.ui.find_key.clicked.connect(lambda : pcap.搜索密钥(self))
        self.ui.sd_but.clicked.connect(lambda : pcap.单条解密按钮(self))
        self.ui.auto_but.clicked.connect(lambda : pcap.自动解密按钮(self))

        # 杂乱
        self.ui.mod_but.clicked.connect(lambda: os.startfile(os.path.relpath('./mod')))
        self.ui.BT_en_but.clicked.connect(lambda: others.bt_密码生成(self))
        self.ui.pyc_but.clicked.connect(lambda: others.pyc_反编译(self))
        self.ui.time_zhuan.clicked.connect(lambda: others.时间戳转换(self))
        self.ui.rsa_public.clicked.connect(lambda: others.RSA公钥分解(self))

        # TODO 日志文件分析 
    
    def 获取shell类型(self):
        shell工具 = self.ui.shell_name.currentText()
        self.ui.shell_maner.clear()
        if shell工具 == '菜刀':
            if self.ui.shell_type.currentText() == 'PHP':
                self.ui.shell_maner.addItems(['PHP'])
        elif shell工具 == '蚁剑': 
            if self.ui.shell_type.currentText() == 'PHP':
                self.ui.shell_maner.addItems(['PHP','PHP_RSA'])
            elif self.ui.shell_type.currentText() == 'JSP':
                self.ui.shell_maner.addItems(['JSP'])
            elif self.ui.shell_type.currentText() == 'ASP':
                self.ui.shell_maner.addItems(['ASP'])
        elif shell工具 == '哥斯拉':
            if self.ui.shell_type.currentText() == 'PHP':
                self.ui.shell_maner.addItems(['PHP_XOR_BASE64', 'PHP_XOR_RAW', 'PHP_EVAL_XOR_BASE64'])
            elif self.ui.shell_type.currentText() == 'JSP':
                self.ui.shell_maner.addItems(['JAVA_AES_BASE64', 'JAVA_AES_RAW'])
            elif self.ui.shell_type.currentText() == 'ASP':
                self.ui.shell_maner.addItems(['ASP_BASE64', 'ASP_EVAL_BASE64','ASP_RAW','ASP_XOR_BASE64','ASP_XOR_RAW'])
            elif self.ui.shell_type.currentText() == 'CSHAP':
                self.ui.shell_maner.addItems(['CSHAP_AES_BASE64', 'CSHAP_EVAL_AES_BASE64','CSHAP_ASMX_AES_BASE64','CSHAP_AES_RAW'])
        elif shell工具 == '冰蝎':
            if self.ui.shell_type.currentText() == 'PHP':
                self.ui.shell_maner.addItems(['PHP'])
            elif self.ui.shell_type.currentText() == 'JAVA':
                self.ui.shell_maner.addItems(['JAVA'])
            elif self.ui.shell_type.currentText() == 'ASP':
                self.ui.shell_maner.addItems(['ASP'])
            elif self.ui.shell_type.currentText() == 'ASPX':
                self.ui.shell_maner.addItems(['CSHARP'])
        elif shell工具 == '请选择':
            self.ui.print_echo.append('请选择要使用的工具')
        
    def 显示帮助(self,index):
        if index == 0:  # 如果是第一个标签被点击  
            self.ui.print_echo.append('''
文件工具说明：
选择文件后使用相应按钮
1、文件二进制,使用二进制方式打开文件，用于文件头识别 或 文件尾隐写
2、文件分离,使用binwalk队文件进行分离
3、字符串搜索,设置正则表达式或字符串,在文件内进行搜索
4、字频分析,对英文字母在文件中出现的次数进行分析
''' )
        elif index == 1:
            self.ui.print_echo.append('''
字符串工具说明：
将需要解析的字符串保存在文档中,再点击相应按钮
1、16进制转字符串
2、全BASE系列转码,支持base16,base32,base64,base85
3、连续base64,对指定字符串进行多次base64转码,不限次数,直到不能再解析
4、栅栏密码爆破,自动爆破栅栏密码的全部形式
5、W型栅栏密码爆破,同上
6、凯撒密码爆破
7、核心价值观密码破解
''')
        elif index == 2:
            self.ui.print_echo.append('''
图片misc工具:
1、图片exif信息,读取图片的高度、宽度、拍摄时间、写入时间、GPS时间、拍摄设备制造商、经纬度、海拔等信息
2、盲水印:在变量1中输入原图地址,变量2中输入加密图,在点击相应按钮
3、二进制转图片: 对二进制文件进行图片转换. 0为黑 1为白
4、RGB转图片: 对RGB组数转换为图片 内容样式为[[255,255,255],[2,213,255]]
5、jpg宽高修正: 对jpg图片进行宽高翻倍,查看是否存在隐藏信息
6、PNG宽高爆破: 通过CRC爆破PNG文件真实高度和宽度
7、GIF帧分离,将gif图片分解成单个帧,保存在原文件目录下
''')
        elif index == 3:
            self.ui.print_echo.append('''
压缩包misc工具:
1.单文件CRC 指一个压缩包中有多个加密文件,并且内容为4字符 需要 选择文件
2.多文件CRC 指一个文件夹下有多个压缩包,每个压缩包里面都有1个文件需要crc爆破 需要 选择文件夹''' )
        elif index == 4:
            self.ui.print_echo.append('''
流量分析工具:
1、键鼠流量,选择文件后,点击相应的功能按钮
2、流量分析,选择文件后,输入过滤器,再点击相应的功能按钮
3、SQL注入分析: 提取流量日志中的sql注入信息,分析库名、表明、列名、内容
    ''')
        elif index == 5:
            self.ui.print_echo.append('''
杂项工具:
1、宝塔面板加密, 在变量1中输入要设置的密码,变量2中输入盐值(数据库里看),点击按钮,生成用于替换数据库内的密码
''' )
   
                                    
if __name__ == "__main__":
    app = QApplication()
    windows = MainWindow()
    windows.show()
    app.exec()
